package android.pruebas.listview4;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.TextView;

/**
 * Sincroniza los datos de contacto con la lista de la actividad.
 * @author luis
 *
 */
public class ContactoArrayAdapter extends ArrayAdapter<Contacto> {
	private static final String tag = "ContactoArrayAdapter";

	private Contactos contactos;
	private Contactos contactosFiltrados;
	private FiltroContactos filtro;
	public ContactoArrayAdapter(Context contexto, int textViewResourceId, Contactos contactos )  {
		super(contexto, textViewResourceId, contactos);
		this.contactos = contactos;

		// Inicializar la lista de para visualizar.
		this.contactosFiltrados = new Contactos();
		contactosFiltrados.addAll(contactos);

	}

	/**
	 * Tamaño de la lista de contactos.
	 */
	public int getCount() {
		return this.contactosFiltrados.size();
	}

	/**
	 * Devuelve el contacto que están en la posición index.	
	 */
	public Contacto getItem(int index) {
		return this.contactosFiltrados.get(index);
	}

	/**
	 * Devuelve el objeto View, que le corresponde a un item, para mostrarlo en la pantalla.
	 */
	public View getView(int position, View convertView, ViewGroup parent) {
		View row = convertView;

		TextView txtNombre;
		TextView txtTelefono;

		if (row == null) {
			LayoutInflater inflater = (LayoutInflater) this.getContext()
					.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
			row = inflater.inflate(R.layout.contacto_list_item , parent, false);
		}

		// Get item
		Contacto contacto = getItem(position);

		// Get reference to TextView 
		txtNombre = (TextView) row.findViewById(R.id.nombre);
		txtTelefono = (TextView) row.findViewById(R.id.telefono);

		txtNombre.setText(contacto.getNombre());
		txtTelefono.setText(contacto.getTelefono());


		return row;
	}

	@Override
	public Filter getFilter() {
		if(filtro==null) {
			filtro = new FiltroContactos();
		}
		return filtro;
	}


	/*
	 * Definir el filtro de contactos.
	 */
	private class FiltroContactos extends Filter {

		protected FilterResults performFiltering(CharSequence prefix) {
			FilterResults results = new FilterResults();
			Contactos cf = new Contactos();

			Log.d(tag,"performFiltering:"+ prefix.toString());

			prefix = prefix.toString().toLowerCase();

				for(Contacto c : contactos) {
					if(c.getNombre().toLowerCase().contains(prefix)) {
						cf.add(c);
					}
				}

				results.values = cf;
				results.count = cf.size(); 
				Log.d(tag,"performFilterin count:"+ cf.size());

				

			return results;
		}

		/*
		 * Publica los resultados de filtrar los contactos.
		 * @see android.widget.Filter#publishResults(java.lang.CharSequence, android.widget.Filter.FilterResults)
		 */
		@Override
		protected void publishResults(CharSequence prefix, FilterResults results) {
			Log.d(tag,"publishResults: count"+ results.count);

				contactosFiltrados = new Contactos();
				contactosFiltrados.addAll((Contactos) results.values);
			Log.d(tag,"notifyDataSetChanged");
			notifyDataSetChanged();	


		}

	}     
}